﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Datos;


namespace Negocio.catalogos
{
    public class catalogoHorario
    {
        ControlAsistenciaEntities _objEntity = new ControlAsistenciaEntities();
        /// <summary>
        /// Obtiene los datos de un horario de un docente por periodo
        /// </summary>
        /// <param name="_idPeriodo">filtro</param>
        /// <returns>lista de horario por docente y periodo</returns>
        public List<clases_tontas.horarioClases> obtenerHorario(int _idPeriodo)
        {
            List<clases_tontas.horarioClases> _listaHorario = new List<clases_tontas.horarioClases>();

            try
            {
                foreach (var item in _objEntity.procConsultarHorario(_idPeriodo))
                {
                    _listaHorario.Add(new clases_tontas.horarioClases(item.idDetalleHorario, item.detalle, item.horaEntrada, item.horaSalida, new catalogoDistribucion().obtenerDistribucionId(Convert.ToInt32(item.idDistribucion)).First(), item.idPeriodo, item.backGroundColor, item.borderColor,(DateTime)item.ultimoAcceso));
                }
            }
            catch (Exception e)
            {
                throw e;
            }
            return _listaHorario;
        }

        /// <summary>
        /// obtener el horario por periodo y codigo distribucion
        /// </summary>
        /// <param name="_codDistribucion">filtro</param>
        /// <param name="_idPeriodo">filtro</param>
        /// <returns>lista de horario por periodo y codigo de distribucion</returns>
        public List<clases_tontas.horarioClases> obtenerHorarioXidPeriodoANDidDistribucion(int _idPeriodo, int _idDistribucion)
        {
            List<clases_tontas.horarioClases> _listaHorario = new List<clases_tontas.horarioClases>();
            try
            {
                foreach (var item in _objEntity.procConsultarHorarioxIDPeriodoANDidDistribucion(_idDistribucion, _idPeriodo))
                {
                    _listaHorario.Add(new clases_tontas.horarioClases(item.idDetalleHorario, item.detalle, item.horaEntrada, item.horaSalida, new catalogoDistribucion().obtenerDistribucionId(Convert.ToInt32(item.idDistribucion)).First(), item.idPeriodo, item.backGroundColor, item.borderColor,(DateTime)item.ultimoAcceso));
                }
                return _listaHorario;
            }
            catch (Exception)
            {
                return _listaHorario;
            }
            
        }
        /// <summary>
        /// Obtener las materias y horas el id asistencia
        /// </summary>
        /// <param name="_idAsistencia">Filtro</param>
        /// <returns></returns>
        public List<clases_tontas.horarioClases> obtenerHorarioXisAsistencia(int _idAsistencia)
        {
            List<clases_tontas.horarioClases> _listaHorario = new List<clases_tontas.horarioClases>();
            try
            {
                foreach (var item in _objEntity.procConsultarHorarioXIDAsitencia(_idAsistencia))
                {
                    _listaHorario.Add(new clases_tontas.horarioClases(item.horaEntrada.ToString(), item.horaSalida.ToString(), new catalogoDistribucion().obtenerDistribucionId(Convert.ToInt32(item.idDistribucion)).First()));
                }
                return _listaHorario;
            }
            catch (Exception)
            {
                return _listaHorario;
            }
        }
        /// <summary>
        /// Permite agregar los datos al horario
        /// </summary>
        /// <param name="_agregar">objeto de clase</param>
        public bool agregarHorario(clases_tontas.horarioClases _agregar)
        {
            try
            {
                _objEntity.procAgregarHorario(_agregar.idDetalleHorario, _agregar.detalle, _agregar.horaEntrada, _agregar.horaSalida, _agregar.idDistribucion.idDistribucion, _agregar.idPeriodo, _agregar.backGroundColor, _agregar.borderColor,_agregar.ultimoAcceso);
                return true;
            }
            catch (Exception e)
            {
                throw e;
                //return false;
            }

        }
        /// <summary>
        /// Modificar los horarios de clases
        /// </summary>
        /// <param name="_editar">objeto de clase</param>
        public bool modificarHorario(clases_tontas.horarioClases _editar)
        {
            try
            {
                _objEntity.procModificarHorario(_editar.idDetalleHorario, _editar.detalle, _editar.horaEntrada, _editar.horaSalida,_editar.ultimoAcceso);
                return true;
            }
            catch (Exception e)
            {

                //return false;
                throw e;
            }
        }   
        /// <summary>
        /// obtener el horario por periodo y codigo distribucion
        /// </summary>
        /// <param name="_codDistribucion">filtro</param>
        /// <param name="_idPeriodo">filtro</param>
        /// <returns>lista de horario por periodo y codigo de distribucion</returns>
        public List<clases_tontas.horarioClases> obtenerHorarioxID(int _idDetalleHorario)
        {
            List<clases_tontas.horarioClases> _lista = new List<clases_tontas.horarioClases>();
            
            try
            {
                var item = _objEntity.procConsultarHorarioxID(_idDetalleHorario).First();
                _lista.Add(new clases_tontas.horarioClases(item.idDetalleHorario, item.detalle, item.horaEntrada, item.horaSalida, new catalogoDistribucion().obtenerDistribucionId(Convert.ToInt32(item.idDistribucion)).First(), item.idPeriodo, item.backGroundColor, item.borderColor,(DateTime)item.ultimoAcceso));
                return _lista;
            }
            catch (Exception)
            {
                return _lista;
            }

        }
        public List<clases_tontas.horarioClases> obtenerHorarioxIDLimpia(int _idDetalleHorario)
        {
            List<clases_tontas.horarioClases> _lista = new List<clases_tontas.horarioClases>();

            try
            {
                var item = _objEntity.procConsultarHorarioxID(_idDetalleHorario).First();
                _lista.Add(new clases_tontas.horarioClases { idDetalleHorario = item.idDetalleHorario, detalle = item.detalle, horaEntrada = item.horaEntrada, horaSalida = item.horaSalida, idDistribucionInt = (int)item.idDistribucion, idPeriodo = item.idPeriodo, backGroundColor = item.backGroundColor, borderColor = item.borderColor, ultimoAcceso = (DateTime)item.ultimoAcceso });
                return _lista;
            }
            catch (Exception)
            {
                return _lista;
            }

        }

        public int obtenerNroHoraHorario(int _idPeriodo, int _idDistribucion)
        {
            int nroHora =0;
            DateTime dia = DateTime.Now;
            try
            {
                //Falta agregar 

                var horario = (from item in _objEntity.procConsultarHorarioxIDPeriodoANDidDistribucion(_idDistribucion, _idPeriodo)
                              where item.detalle == DateTime.Now.DayOfWeek.ToString()
                              select item).FirstOrDefault();
                DateTime diaHora = DateTime.Now; //Obtiene dia actual       


                TimeSpan _intervaloHoraEntrada = TimeSpan.Parse(horario.horaEntrada);
                TimeSpan _intervaloHoraSalida = TimeSpan.Parse(horario.horaSalida);

                DateTime dia1 = new DateTime(dia.Year, dia.Month, dia.Day, _intervaloHoraEntrada.Hours, _intervaloHoraEntrada.Minutes, 0); //Hora Inicio 
                DateTime dia2 = new DateTime(dia.Year, dia.Month, dia.Day, _intervaloHoraSalida.Hours, _intervaloHoraSalida.Minutes, 0);  //hora Fin

                
                return nroHora = (dia2.Subtract(dia1)).Hours;;
            }
            catch (Exception)
            {

                return nroHora = 0;
            }
        }

        public int obtenerNroHoraHorarioXDIa(int _idPeriodo, int _idDistribucion, DateTime _fecha)
        {
            int nroHora = 0;
            int horaDiaAcumulada = 0;
            try
            {
                var horario = (from item in _objEntity.procConsultarHorarioxIDPeriodoANDidDistribucion(_idDistribucion, _idPeriodo)
                               where item.detalle == _fecha.DayOfWeek.ToString()
                               select item);
                foreach (var item in horario)
                {

                    TimeSpan _intervaloHoraEntrada = TimeSpan.Parse(item.horaEntrada);
                    TimeSpan _intervaloHoraSalida = TimeSpan.Parse(item.horaSalida);

                    DateTime dia1 = new DateTime(_fecha.Year, _fecha.Month, _fecha.Day, _intervaloHoraEntrada.Hours, _intervaloHoraEntrada.Minutes, 0); //Hora Inicio 
                    DateTime dia2 = new DateTime(_fecha.Year, _fecha.Month, _fecha.Day, _intervaloHoraSalida.Hours, _intervaloHoraSalida.Minutes, 0);  //hora Fin
                    nroHora = (dia2.Subtract(dia1)).Hours; 
                    horaDiaAcumulada = horaDiaAcumulada + nroHora;

                }

                return horaDiaAcumulada;

            }
            catch (Exception)
            {

                return nroHora = 0;
            }
        }

        public int obtenerNroHoraHorarioSemanal(int _idPeriodo, int _idDistribucion)
        {
            int totalSemanal = 0;
            DateTime dia = DateTime.Now;                        
            //Buscar inicio de semana
            //Inicio busqueda inicio de semana
            while (dia.DayOfWeek != DayOfWeek.Monday)
            {
                if (dia.DayOfWeek == DayOfWeek.Sunday)
                {
                    dia = dia.AddDays(1);
                }
                else
                {
                    dia = dia.AddDays(-1);
                }
            }
            try
            {
                var consultaHorario = new catalogoHorario().obtenerHorarioXidPeriodoANDidDistribucion(_idPeriodo, _idDistribucion);
                
                if (consultaHorario.Count() > 0)
                {
                    //Bucle por cada de la semana
                    totalSemanal = 0;
                    for (int i = 0; i < 5; i++)
                    {

                        int nroHoraDistribucion = 0;

                        foreach (var item in consultaHorario)
                        {
                            if (dia.DayOfWeek.ToString() == item.detalle)
                            {

                                TimeSpan _intervaloHoraEntrada = TimeSpan.Parse(item.horaEntrada);
                                TimeSpan _intervaloHoraSalida = TimeSpan.Parse(item.horaSalida);

                                DateTime dia1 = new DateTime(dia.Year, dia.Month, dia.Day, _intervaloHoraEntrada.Hours, _intervaloHoraEntrada.Minutes, 0); //Hora Inicio 
                                DateTime dia2 = new DateTime(dia.Year, dia.Month, dia.Day, _intervaloHoraSalida.Hours, _intervaloHoraSalida.Minutes, 0);  //hora Fin

                                nroHoraDistribucion = (dia2.Subtract(dia1)).Hours;
                                totalSemanal = totalSemanal + nroHoraDistribucion;
                            }
                            //fin busqueda dia de la semana                             
                        }

                        dia = dia.AddDays(1);

                    }
                }
                else
                {
                    totalSemanal = 0;
                }
                return totalSemanal;
            }
            catch (Exception)
            {

                return totalSemanal = 0;
            }
        }

        public int obtenerNroHoraHorarioXIDDetalleHorario(int _idDetalleHorario)
        {
            int nroHora = 0;
            DateTime dia = DateTime.Now;
            try
            {
                //Falta agregar 

                var horario = _objEntity.procConsultarHorarioxID(_idDetalleHorario).FirstOrDefault();

                DateTime diaHora = DateTime.Now; //Obtiene dia actual       


                TimeSpan _intervaloHoraEntrada = TimeSpan.Parse(horario.horaEntrada);
                TimeSpan _intervaloHoraSalida = TimeSpan.Parse(horario.horaSalida);

                DateTime dia1 = new DateTime(dia.Year, dia.Month, dia.Day, _intervaloHoraEntrada.Hours, _intervaloHoraEntrada.Minutes, 0); //Hora Inicio 
                DateTime dia2 = new DateTime(dia.Year, dia.Month, dia.Day, _intervaloHoraSalida.Hours, _intervaloHoraSalida.Minutes, 0);  //hora Fin

                return nroHora = (dia2.Subtract(dia1)).Hours; ;

            }
            catch (Exception)
            {

                return nroHora = 0;
            }
        }
        public List<clases_tontas.horarioClases> consultarDistribucionesDiarias(string dia,int distribucion,int periodo)
        {
            List<clases_tontas.horarioClases> _lista = new List<clases_tontas.horarioClases>();
            foreach (var item in _objEntity.procConsultarDistribucionesxDias(dia,distribucion,periodo))
            {
                _lista.Add(new clases_tontas.horarioClases {idDistribucionInt=(int)item.idDistribucion,observacion=(int)item.idObservacion, horaEntrada=item.horaEntrada,horaSalida=item.horaSalida,fecha=(DateTime)item.fechaCabecera,idCabecera=item.idCabecera});    
            }
            return _lista;
        }

    }
}
